// 修改导入路径和函数名
import { renderAndSendMsgAuto } from '../resources/xr/xr.js';
import fetch from 'node-fetch';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { loadTimeConfig, addTaskToGroup } from '../modules/timeconfig.js';
import { handleTimeConfig } from '../modules/timeHandler.js'; 
import { createLogger } from '../modules/Logger.js';

// 获取当前文件的路径
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 背景图数据目录
const BG_IMAGES_DIR = path.resolve(__dirname, '../data/背景图');
const BG_IMAGES_FILE = path.join(BG_IMAGES_DIR, 'square_images.json');

// 确保背景图目录存在
if (!fs.existsSync(BG_IMAGES_DIR)) {
  fs.mkdirSync(BG_IMAGES_DIR);
}
if (!fs.existsSync(BG_IMAGES_FILE)) {
  fs.writeFileSync(BG_IMAGES_FILE, JSON.stringify([]));
}

class PippiStatusPlugin extends plugin {
  constructor() {
    super({
      name: 'pippi_status',
      dsc: '皮皮的设备运行状态',
      event: 'message',
      priority: 6,
      rule: [
        { reg: "^#弹幕姬服务器状态$", fnc: 'sendDeviceStatus', permission: 'all' },
      ],
    });
    // 创建日志实例
    this.logger = createLogger(this.name);

    const config = loadTimeConfig();
    this.intervalConfig = config.PippiStatusPlugin;
    this.groupIDs = config.groupIDs || [789090770, 971095759];

    // 自动启动检测任务：只有当配置文件中明确配置了非 0 的时间间隔时启动检测任务
    if (this.intervalConfig !== undefined && this.intervalConfig !== 0) {
      this.startDeviceStatusCheck(null);  // 自动启动检测任务
    }
  }

  async sendDeviceStatus(e) {
    if (e) await e.reply('正在获取弹幕姬服务器状态，请稍等...', true, { recallMsg: 10 });
    try {
      const data = await this.getDeviceStatus();
      if (data.status !== 'success') {
        if (e) await e.reply('获取弹幕姬服务器状态失败，请稍后再试。', true, { recallMsg: 10 });
        return;
      }

      const statsMsg = `CPU 状态: ${data.CPU}
GPU 状态: ${data.GPU}
内存状态: ${data.RAM}
显存状态: ${data.VRAM}
运行消息: ${data.message}`;

      const imageUrl = this.getRandomBackgroundImage();

      // 修改渲染函数调用
      if (e) await renderAndSendMsgAuto(e, imageUrl, statsMsg, '皮皮的小工具', '弹幕姬服务器状态');
    } catch (error) {
      console.error('获取弹幕姬服务器状态时发生错误:', error);
      if (e) await e.reply('获取弹幕姬服务器状态时发生错误，请稍后再试。');
      this.logger.error(`获取弹幕姬服务器状态时发生错误: ${error.message}`);
    }
  }

  // 获取设备状态
  async getDeviceStatus() {
    const url = 'http://hh2233.cn:12581/status';

    const fetchWithTimeout = (url, timeout = 10000) => {
      return Promise.race([
        fetch(url),
        new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout)),
      ]);
    };

    try {
      console.log(`正在请求 ${url}`);
      const response = await fetchWithTimeout(url);
      const data = await response.json();
      console.log('获取设备运行状态完成');
      return data;
    } catch (error) {
      console.error('获取设备运行状态时发生错误:', error);
      this.logger.error(`获取设备运行状态时发生错误: ${error.message}`);
      throw error;  // 统一进入 catch 块处理错误
    }
  }

  // 获取随机背景图链接
  getRandomBackgroundImage() {
    const backgroundImages = this.loadBackgroundImages();
    if (backgroundImages.length === 0) {
      return ''; // 如果没有背景图，则返回空字符串
    }
    const randomIndex = Math.floor(Math.random() * backgroundImages.length);
    return backgroundImages[randomIndex];
  }

  // 加载背景图链接
  loadBackgroundImages() {
    try {
      const data = fs.readFileSync(BG_IMAGES_FILE, 'utf-8');
      return JSON.parse(data);
    } catch (error) {
      console.error('加载背景图链接失败:', error);
      this.logger.error(`加载背景图链接失败: ${error.message}`);
      return [];
    }
  }

  // 启动定时任务：弹幕姬服务器状态检测
  async startDeviceStatusCheck(e) {
    const { cronExpression, intervalType, timeValue } = handleTimeConfig(this.intervalConfig, this.name);
    // 将弹幕姬服务器检测任务添加到任务组“皮皮的定时器”
    addTaskToGroup("弹幕姬服务器检测", this.deviceStatusCheckTask.bind(this), cronExpression);
    if (e) {
      await e.reply(`服务器检测任务已启动，每 ${timeValue} ${intervalType}进行一次检测。`);
    }
  //  this.logger.info(`服务器检测任务已启动，间隔: 每 ${timeValue} ${intervalType} 执行一次`);
  }

  // 定时任务执行：检查设备状态并推送异常消息到多个群聊
  async deviceStatusCheckTask() {
    const data = await this.getDeviceStatus();
    if (data.message.includes("异常") || data.status !== 'success') {
      const statsMsg = `【异常】弹幕姬服务器状态异常，设备数据如下：
        CPU 状态: ${data.CPU}
        GPU 状态: ${data.GPU}
        内存状态: ${data.RAM}
        显存状态: ${data.VRAM}
        运行消息: ${data.message}`;

      // 按照每隔一秒的间隔发送消息到多个群聊
      for (let i = 0; i < this.groupIDs.length; i++) {
        setTimeout(async () => {
          await Bot.pickGroup(this.groupIDs[i]).sendMsg(statsMsg);
          this.logger.info(`异常: 服务器状态异常 发送到群聊 ${this.groupIDs[i]}`);
        }, i * 1000);
      }
    } else {
      // 状态正常时记录日志
      this.logger.info('服务器状态正常');
    }
  }
}

export default PippiStatusPlugin;